誠如前文最後一張操作流程圖所示,查核系統裡,第一個重要的功能就是「圖片文字辨識 (OCR, Optical Character Recognition)」。這個功能可以將照片中的標示文字自動轉換成電腦可讀取的資料,避免查核人員需要手工謄寫紙本。
本系統使用的是 Azure AI Vision 的影像分析 API,每個月免費限額 5,000 筆資料,每分鐘可支援 20 筆資料,至於要怎麼呼叫 API ,Azure 在官方文件中,有提供基礎範本供使用者參考。
由於 Azure AI Vision 理論上還是個收費的 API,在撰寫程式時,最好將私鑰存在另一份檔案,不要直接放在程式碼中。
// app.py
from dotenv import load_dotenv
OCR_endpoint = os.getenv("OCR_endpoint")
OCR_APIKey = os.getenv("OCR_APIKey")
接著,參考官方文件的寫法,我們建立call_ocr 函式呼叫 Azure OCR 服務,具體而言,是透過 Azure 提供的 ImageAnalysisClient 類呼叫 OCR,讓系統將圖片丟給 Azure OCR 處理並回傳結果。為了避免中途發生錯誤,設定錯誤提醒:
// app.py
from azure.ai.vision.imageanalysis import ImageAnalysisClient  # pip install azure-ai-vision-imageanalysis
from azure.core.credentials import AzureKeyCredential
def callOCR(image):
    try:
        client = ImageAnalysisClient(
            endpoint=OCR_endpoint,
            credential=AzureKeyCredential(OCR_APIKey)
        )
        result = client.analyze(
            image_data=image,
            visual_features=["Read"],
        )
        if not result.read or not result.read.blocks:
            return "OCR 沒有解析出文字"
        
        return "\n".join(line.text for block in result.read.blocks if block.lines for line in block.lines)
        
    except Exception as e:
        print(f"OCR 發生錯誤: {str(e)}")
        return f"OCR 失敗: {str(e)}"
不過,只有callOCR還不夠。使用者需要一個「入口」(可以理解為對外界面)來上傳圖片並獲得結果--Flask 提供的路由 @app.route("/ocr"):
這段程式碼的功能包含:
在程式碼中一樣要記得加入錯誤提醒,方便除錯!
// app.py
@app.route("/ocr", methods=["POST"])
def ocr():
    try:
        files = request.files.getlist("file")
        if not files:
            return jsonify({"status": "error", "message": "未提供任何檔案"}), 400
        valid_results = []
        # 使用 ThreadPoolExecutor 併發處理多檔案 OCR
        def processFile(storageFile):
            try:
                # 嘗試開啟圖片驗證
                img = Image.open(storageFile.stream)
                img = img.convert("RGB")  # 統一 RGB
                # 儲存到 BytesIO,作為 OCR 輸入
                img_bytes = BytesIO()
                img.save(img_bytes, format="JPEG", quality=90)
                img_bytes.seek(0)
                return callOCR(img_bytes.read())
            except Exception as e:
                return f"{file_storage.filename} 非有效圖片或處理失敗: {e}"
        with ThreadPoolExecutor(max_workers=3) as executor:
            valid_results = list(executor.map(process_file, files))
        # 組合結果
        combined_text = ""
        for idx, text in enumerate(valid_results, start=1):
            combined_text += f"照片 {idx}:\n{text}\n\n"
        return combined_text
    except Exception as e:
        return jsonify({"status": "error", "message": str(e)}), 500
總結來說,OCR 圖片辨識是查核系統的「基礎功能之一」。它能快速將照片轉換成文字,為後續的法規比對與資料治理打下基礎,讓整個查核流程更高效、更可靠。